package puffer.starter.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.ArrayList;
import java.util.List;

/**
 * 遍历树结构 根据 key parentKey
 *
 * @author WangYongJi
 */
public class TreeKit {

    /**
     * 把完整的数据集合，排成树结构
     * <p>
     * 返回按指定 key parentKey 进行排序
     *
     * @param keyName        自己的标记，例：id
     * @param parentKeyName  父标记，例 pid
     * @param genList        全部根节点数据
     * @param notGenList     去除根节点的之后的全部数据
     * @param childArrayName 子数组名称
     */
    public static ArrayList<JSONObject> listToTree(String keyName, String parentKeyName, String childArrayName, List<?> genList, List<?> notGenList) {
        ArrayList<JSONObject> arrayList = new ArrayList<>();
        JSONArray jsonGenList1 = JSON.parseArray(JSON.toJSONString(genList, SerializerFeature.WriteMapNullValue));
        JSONArray jsonNotGenList1 = JSON.parseArray(JSON.toJSONString(notGenList, SerializerFeature.WriteMapNullValue));
        for (Object o : jsonGenList1) {
            JSONArray array = listToTree(keyName, parentKeyName, childArrayName, ((JSONObject) o), jsonNotGenList1);
            ((JSONObject) o).put(childArrayName, array);
            arrayList.add(((JSONObject) o));
        }
        return arrayList;
    }

    /**
     * 把完整的数据集合，排成树结构
     * <p>
     * 返回按指定 key parentKey 进行排序
     *
     * @param parentObject     根节点对象
     * @param removeParentList 去除根节点的之后的全部数据
     * @param key              自己的标记，例：id
     * @param parentKey        父标记，例 pid
     * @param childArrayName   子数组名称
     */
    private static JSONArray listToTree(String key, String parentKey, String childArrayName, JSONObject parentObject, JSONArray removeParentList) {
        JSONArray childList = new JSONArray();
        for (int i = 0; i < removeParentList.size(); i++) {
            JSONObject now_obj = (JSONObject) removeParentList.get(i);
            String now_pid = now_obj.getString(parentKey);
            //查得到
            if (now_pid.equals(parentObject.getString(key))) {
                childList.add(now_obj); // 同级别添加
                listToTree(key, parentKey, childArrayName, now_obj, removeParentList);//继续递归
            }
            //非同级别不作处理
            else {

            }
        }
        if (childList.size() != 0) {
            parentObject.put(childArrayName, childList);
        }
        return childList;
    }

}
